package br.com.werp.regras.documento.integracao;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

import br.com.werp.regras.geral.ErroPadrao;
import br.com.werp.regras.geral.integracao.MasterDAO;
import br.com.werp.regras.geral.util.Constantes;
import br.com.werp.regras.geral.util.Dia;
import br.com.werp.regras.geral.util.Util;
import br.com.werp.regras.geral.vos.documento.DocumentoFinanceiroAgrupadoVO;
import br.com.werp.regras.geral.vos.documento.DocumentoFinanceiroVO;
import br.com.werp.regras.geral.vos.tabelas.Documento;
import br.com.werp.regras.geral.vos.tabelas.Documento_financeiro;


/**
 * @author Sobreira
 * Criado em 24/11/2004
 *
 */
public class DocumentoFinanceiroDAO extends MasterDAO {
    private static DocumentoFinanceiroDAO documentoFinanceiroDAO;

    private DocumentoFinanceiroDAO(String banco) throws Exception {
        super(banco);
    }

    public static DocumentoFinanceiroDAO getDocumentoFinanceiroDAO()
        throws Exception {
        if (documentoFinanceiroDAO == null) {
            documentoFinanceiroDAO = new DocumentoFinanceiroDAO(Constantes.BANCO);
        }

        return documentoFinanceiroDAO;
    }

    /**
     * @param connection
     * @param documento
     * @throws Exception
     */
    public void inserirDocumento(Object c, Documento documento)
        throws Exception {
        Connection connection = validarTransacao(c);
        inserirVO(connection, documento);
    }

    /**
     * @param connection
     * @param documento_financeiro
     * @throws Exception
     */
    public void inserirDocumentoFinanceiro(Object c,
        Documento_financeiro documento_financeiro) throws Exception {
        Connection connection = validarTransacao(c);
        inserirVO(connection, documento_financeiro);
    }
    public List obterDocumentoFinanceiro(
            DocumentoFinanceiroVO documentoFinanceiroVO) throws Exception {
        return obterDocumentoFinanceiro(documentoFinanceiroVO, null, null);
    }

    public List obterDocumentoFinanceiro(
        DocumentoFinanceiroVO documentoFinanceiroVO,Dia dataInicio ,Dia dataFim) throws Exception {
        StringBuffer where = new StringBuffer();
        where.append(" and dcfi_documento = docm_id ");
        where.append(" and docm_tipo = tdoc_id ");

        if (!Util.isNullOrEmpty(documentoFinanceiroVO.getDcfi_descricao())) {
            where.append(" and  dcfi_descricao like " +
                aspasLike(documentoFinanceiroVO.getDcfi_descricao()));
            documentoFinanceiroVO.setDcfi_descricao(null);
        }
        
        if(dataInicio !=null){
            where.append(" and dcfi_emissao >= " + dataInicio.getDataBanco());
        }
        
        if(dataFim !=null){
            where.append(" and dcfi_emissao <= " + dataFim.getDataBanco());
            
        }

        String wheretoString = where.toString().trim();
        String tabelas = "documento_financeiro, documento, tipo_documento";

        Connection connection = getConexao();

        try {
            return pesquisarVO(connection, documentoFinanceiroVO,
                wheretoString, tabelas, DocumentoFinanceiroVO.EXCLUIDAS);
        } finally {
            liberaConeccao(connection);
        }
    }

    public void atualizaDocumento(Object transKey, Documento documento)
        throws Exception {
        Connection connection = validarTransacao(transKey);
        atualizarVO(connection, documento, new String[] { "docm_id" });
    }

    public void atualizaDocumentoFinanceiro(Object transKey,
        Documento_financeiro documento_financeiro) throws Exception {
        Connection connection = validarTransacao(transKey);
        atualizarVO(connection, documento_financeiro,
            new String[] { "dcfi_documento" });
    }

    public void excluirDocumento_financeiro(Object key,
        Documento_financeiro documento_financeiro)
        throws ErroPadrao, SQLException, Exception {
        excluirVO(validarTransacao(key), documento_financeiro);
    }

    public List obterDocumentoFinanceiroAgrupador(Object key,
        DocumentoFinanceiroAgrupadoVO documentoFinanceiroAgrupadoVO)
        throws Exception {
        Connection connection = null;
    
        if (key == null) {
            connection = getConexao();
        } else {
            connection = validarTransacao(key);
        }
    
        String where = " and dcfi_documento = docm_id and " +
                "apdo_doc_agrupador = docm_id  and docm_tipo = tdoc_id";
        String tabelas = " documento_financeiro , documento , agrupamento_documento ,tipo_documento ";
    
        try {
            return pesquisarVO(connection, documentoFinanceiroAgrupadoVO,
                where, tabelas, DocumentoFinanceiroAgrupadoVO.EXCLUIDAS);
        } finally {
            if (key == null) {
                liberaConeccao(connection);
            }
        }
    }
}
